<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        hello
    </div>
    <script>
        // 模拟vue中data选项
        const data = {
            msg: 'hello',
            count: 10
        }
        // 模拟Vue的实例
        const vm = {}

        function proxyData (data) {
            Object.keys(data).forEach(key => {
                // 数据劫持：当访问或者设置 vm 中的成员的时候，做一些干预操作
                // 把 data 中的属性，转换成 vm 的 getter/setter
                Object.defineProperty(vm, key, {
                    enumerable: true,
                    configurable: true,
                    get() {
                        console.log('触发了get')
                        return data[key]
                    },
                    set(newVal) {
                        console.log('触发了set')
                        if(newVal === data[key]) return
                        data[key] = newVal
                        // 更新视图
                        document.querySelector('#app').textContent = data[key]
                    }
                })
            })
        }

        proxyData(data)

        // 测试
        vm.msg = 'Hello World'
    </script>
</body>
</html>